#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = '汤小洋'

'''
默认参数，即有默认值的参数
'''


def fn(x, y=2):  # 一般必选参数在前，默认参数在后
    print(x)
    print(y)


fn(3, 8)
print('--------------------------------------------')

'''
可变参数，表示参数个数是可变的，使用*号
'''


def f1(x, *y):
    print(x)
    print(y)  # 接收到的实际上是一个tuple，会自动将传入的可变参数封装为tuple


f1("a", "b", "c")


def f2(*x, y):  # 不建议这样做，建议将必选参数放在最前面
    print(x)
    print(y)


f2("a", "b", y="c")  # 必选参数在后面时需要指定参数名


# 练习：计算任意多个数字之和
def sum(*x):
    res = 0
    for i in x:
        res += i
    return res


print(sum(2, 5, 13, 8, 23))

# 对于可变参数，可以直接传入一个list或tuple，但需要在参数前加一个*号
names = ["tom", "jack", "mike"]
# f1(x='c', names[0], names[1], names[2])
f1(x='c', *names)  # 本质上还是作为可变参数传入

print('--------------------------------------------')

'''
关键字参数，也表示参数个数是可变的，但传递的是带参数名的参数，使用**
'''


def f3(x, **y):
    print(x)
    print(y)  # 接收到的实际上是一个dict，会自动将传入的可变参数封装为dict


f3("a", name='tom', age=23, sex='male')

# 对于关键字参数，可以直接传入一个dict，但需要在参数前加两个**号
user = {"id": 9527, "name": "唐伯虎", "age": 28}
# f3("a", id=user["id"], name=user["name"], age=user["age"])
f3("a", **user)
print('--------------------------------------------')

'''
命名关键字参数，限制关键字参数的名字，使用*分隔，*后面的参数被视为命名关键字参数
'''


def f4(x, *, name, age):
    print(x, name, age)


f4("a", name='tom', age=23)
print('--------------------------------------------')

'''
接收任意参数
'''


def f5(*args, **kwargs):
    print(args, kwargs)


f5(1, 2, 3, 4, name='tom', age=23)
